From 006b15b467a5cd835a6eab1b49023100bdc8f2e6 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Fri, 13 Oct 2023 19:32:56 +0200
Subject: refactor(components): rewrite Code component and usePrism hook

* move Prism styles to Sass placeholders to avoid repeats
* let usePrism consumer define its plugins (remove default ones)
* remove `plugins` prop from Code component
* add new props to Code component to let consumer configure plugins
(and handle plugin list from the given options)

However there are some problems with Prism plugins: line-highlight and
treeview does not seems to be loaded. I don't want to use Babel instead
of SWC so I have no solution for now.
---
 src/pages/article/[slug].tsx | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

(limited to 'src/pages/article/[slug].tsx')

diff --git a/src/pages/article/[slug].tsx b/src/pages/article/[slug].tsx
index dea240f..d1e680c 100644
--- a/src/pages/article/[slug].tsx
+++ b/src/pages/article/[slug].tsx
@@ -33,7 +33,6 @@ import {
 } from '../../utils/helpers';
 import { loadTranslation, type Messages } from '../../utils/helpers/server';
 import {
-  type OptionalPrismPlugin,
   useArticle,
   useBreadcrumb,
   useComments,
@@ -70,8 +69,23 @@ const ArticlePage: NextPageWithLayout<ArticlePageProps> = ({
   });
   const readingTime = useReadingTime(article?.meta.wordsCount ?? 0, true);
   const { website } = useSettings();
-  const prismPlugins: OptionalPrismPlugin[] = ['command-line', 'line-numbers'];
-  const { attributes, className } = usePrism({ plugins: prismPlugins });
+  const { attributes, className } = usePrism({
+    attributes: {
+      'data-toolbar-order': 'show-language,copy-to-clipboard,color-scheme',
+    },
+    plugins: [
+      'toolbar',
+      'autoloader',
+      'show-language',
+      'color-scheme',
+      'copy-to-clipboard',
+      'inline-color',
+      'match-braces',
+      'normalize-whitespace',
+      'command-line',
+      'line-numbers',
+    ],
+  });
   const loadingArticle = intl.formatMessage({
     defaultMessage: 'Loading the requested article...',
     description: 'ArticlePage: loading article message',
@@ -231,10 +245,10 @@ const ArticlePage: NextPageWithLayout<ArticlePageProps> = ({
       str.includes('command-line') ||
       (!str.includes('command-line') && str.includes('language-bash'))
     ) {
-      return `class="${wpBlockClassName} ${commandLineClassName}${languageClassName}" tabindex="0" data-filter-output="#output#`;
+      return `class="${wpBlockClassName} ${commandLineClassName} ${languageClassName}" tabindex="0" data-filter-output="#output#`;
     }
 
-    return `class="${wpBlockClassName} ${lineNumbersClassName}${languageClassName}" tabindex="0`;
+    return `class="${wpBlockClassName} ${lineNumbersClassName} ${languageClassName}" tabindex="0`;
   };
 
   const contentWithPrismClasses = content.replaceAll(
@@ -265,9 +279,7 @@ const ArticlePage: NextPageWithLayout<ArticlePageProps> = ({
       />
       <PageLayout
         allowComments={true}
-        bodyAttributes={{
-          ...(attributes as HTMLAttributes<HTMLDivElement>),
-        }}
+        bodyAttributes={attributes as HTMLAttributes<HTMLDivElement>}
         bodyClassName={styles.body}
         breadcrumb={breadcrumbItems}
         breadcrumbSchema={breadcrumbSchema}
-- 
cgit v1.2.3

